

/**
 * 创建基本数据结构
 *
 */
import types from '@babel/types'

import genTools from '@babel/generator'

const test3 = () => {
  // 创建一个  数字字面量
  let t1 = types.numberLiteralTypeAnnotation(2)

  console.log(t1);

  // 2
  console.log(genTools.default(t1).code);

  // 创建一个 null 字面量
  let n = types.nullLiteralTypeAnnotation()

  // null
  console.log(genTools.default(n).code);

  // 创建一个 boolean 字面量
  let b = types.booleanLiteralTypeAnnotation(false)
  console.log(genTools.default(b).code);

  // 创建一个数组字面量
  let arr = types.arrayExpression([
    types.numericLiteral(1),
    types.numericLiteral(2),
    types.numericLiteral(3),
    types.booleanLiteral(false),
    types.stringLiteral('ok')
  ])

  // [1, 2, 3, false, "ok"]
  console.log(genTools.default(arr).code);

  // undefined 就是根据下面的表示
  let u1 = types.unaryExpression('void', types.numericLiteral(0), true)
  // void 0
  console.log(genTools.default(u1).code);

  // 创建一个字符串
  let s1 = types.stringLiteral('Hello 你好')
  // "Hello \u4F60\u597D"

  console.log(genTools.default(s1,  {
    jsescOption: {
      // 默认中文会转成 Unicode编码 需要改成 utf-8， 默认是 minimal: false
      minimal: true
    }
  }).code);

  // 正则表达式
  let reg1 = types.regExpLiteral('\\.js$', 'g')
  // /\.js$/g
  console.log(genTools.default(reg1).code);


  // 对象
  let obj1 = types.objectExpression([
    // 数组， 一个一个指定， 比如 {name: 'aaa', age: 22}
    types.objectProperty(
      // 这里需要指定标识符，也就是key 为 name
      types.identifier('name'),
      // 指定值为 aaa
      types.stringLiteral('aaa')
    ),

    types.objectProperty(
      types.identifier('age'),
      types.numericLiteral(22)
    ),

    types.objectProperty(
      types.stringLiteral('testarr'),
      types.arrayExpression([
        types.numericLiteral(1),
      ])
    )
  ])
  /**
  {
    name: "aaa",
    age: 22,
    "testarr": [1]
  }
   */
  console.log(genTools.default(obj1).code);
}

test3()